package com.example.demo.component.proxy.cglib.callback;

import com.example.demo.component.proxy.cglib.method.ConcreteClassInterceptor;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;

/**
 * @ClassName Main
 * @Description
 * @date 2023/4/6 14:03
 * @Author yanceysong
 * @Version 1.0
 */
public class Main {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        //设置原始类
        enhancer.setSuperclass(ConcreteClassNoInterface.class);
        //回调过滤器
        enhancer.setCallbackFilter(new ConcreteClassCallbackFilter());
        //方法拦截器，上一篇文章中已经详细介绍过，此处不再赘述。
        Callback interceptor = new ConcreteClassInterceptor();//(1)
        //这个NoOp表示no operator，即什么操作也不做，代理类直接调用被代理的方法不进行拦截。
        Callback noOp = NoOp.INSTANCE;//(2)
        // 表示锁定方法返回值，无论被代理类的方法返回什么值，回调方法都返回固定值。
        Callback fixedValue = new ConcreteClassFixedValue();//(3)
        Callback[] callbacks = new Callback[]{interceptor, noOp, fixedValue};
        enhancer.setCallbacks(callbacks);
        ConcreteClassNoInterface proxyObject = (ConcreteClassNoInterface) enhancer.create();
        System.out.println("*** NoOp Callback ***");
        proxyObject.getConcreteMethodA("hello");
        System.out.println("*** MethodInterceptor Callback ***");
        proxyObject.getConcreteMethodB(1);

        System.out.println("*** FixedValue Callback ***");
        int fixed1 = proxyObject.getConcreteMethodFixedValue(128);
        System.out.println("fixedValue1:" + fixed1);
        int fixed2 = proxyObject.getConcreteMethodFixedValue(256);
        System.out.println("fixedValue2:" + fixed2);
    }
}
